package com.zxw.设计模式.结构型.代理模式.CGLIB代理.proxy;

import cn.hutool.core.date.DateUtil;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * @projectName: util-cloud
 * @package: com.zxw.设计模式.结构型.代理模式.CGLIB代理.proxy
 * @className: UserProxyFactory
 * @author: zhangxuewei
 * @description:
 * @date: 2023/6/17 15:50
 * @version: 1.0
 */
public class ProxyFactory implements MethodInterceptor {

    private Object target;

    public ProxyFactory(Object target) {
        this.target = target;
    }

    public Object getLogProxy() {
        // 增强器类，用来创建动态代理类
        Enhancer en = new Enhancer();
        // 设置代理类的父类字节码对象
        en.setSuperclass(target.getClass());
        // 设置回调，对于代理类中的所有方法调用，都会调用这个回调，但是这个回调需要实现intercept()方法进行拦截
        en.setCallback(this);
        // 创建代理对象并返回
        return en.create();
    }

    /**
     * @param o:           代理对象
     * @param method:      目标对象中的方法实例
     * @param args:        目标对象中的方法参数
     * @param methodProxy: 代理对象中的方法的method实例
     * @return Object
     * @author zhangxuewei
     * @description 实现回调方法
     * @date 2023/6/17 16:04
     */
    @Override
    public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
        System.out.println(DateUtil.now() + " 查询小阿哥,期望小阿哥：" + args[0] + "岁");
        Object res = methodProxy.invokeSuper(o, args);
        return res;
    }
}
